// /*
// 分布式游戏服务器集群的演示程序，核心功能是
// 模拟游戏服务器的核心组件（网关、节点服务、客户端）的
// 启动、通信和优雅关闭过程
// */
// package main

// import (
// 	"fmt"
// 	"gameServer/cluster/client"
// 	"gameServer/cluster/gate"
// 	"gameServer/cluster/node"
// 	"gameServer/registry/memory"
// 	"log"
// 	"os"
// 	"os/signal"
// 	"syscall"
// 	"time"
// )

// // 简单的容器实现用于演示
// type DemoContainer struct {
// 	components []interface {
// 		Init() error
// 		Start() error
// 		Stop() error
// 	}
// }

// func (c *DemoContainer) Add(component interface {
// 	Init() error
// 	Start() error
// 	Stop() error
// }) {
// 	c.components = append(c.components, component)
// }

// func (c *DemoContainer) Server() {
// 	// 初始化所有组件
// 	for _, component := range c.components {
// 		if err := component.Init(); err != nil {
// 			log.Fatalf("Failed to init component: %v", err)
// 		}
// 	}

// 	// 启动所有组件
// 	for _, component := range c.components {
// 		if err := component.Start(); err != nil {
// 			log.Fatalf("Failed to start component: %v", err)
// 		}
// 	}

// 	// 瞪大一段时间让系统稳定
// 	time.Sleep(2 * time.Second)

// 	// 创建并启动客户端
// 	runClientDemo()

// 	// 等待终止信号
// 	sigChan := make(chan os.Signal, 1)
// 	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
// 	<-sigChan

// 	// 停止所有组件
// 	for i := len(c.components) - 1; i >= 0; i-- {
// 		if err := c.components[i].Stop(); err != nil {
// 			log.Infof("Failed to stop component: %v", err)
// 		}
// 	}
// }

// func main() {
// 	// 创建共享注册中心
// 	registry := memory.NewMemoryRegistry()
// 	// 创建实例容器（为什么不用已有的容器呢？这里把demo客户端直接写进容器里面了，不过这样不是导致客户端服务端通用一个终端？？？
// 	// 原因是自制容器已经被管道阻塞了，因此这里用一个普通的
// 	container := &DemoContainer{}
// 	// 创建网关组件
// 	gateComponent := gate.NewGate().SetRegistry(registry).SetTcpServer(":52051")
// 	// 创建节点组件
// 	gameNode := node.NewNode("game", "rune_work.com", 52052).SetRegistry(registry)
// 	chatNode := node.NewNode("chat", "rune_work.com", 52053)
// 	// 添加组件到容器
// 	container.Add(gateComponent)
// 	container.Add(gameNode)
// 	container.Add(chatNode)
// 	log.Info("Starting demo: Distributed Game Server Cluster")
// 	log.Info("Gateway: :52051")
// 	log.Info("Nodes: game@52052, chat@52053")
// 	log.Info("Client will connect and send test messages")
// 	log.Info("Press Ctrl+C to stop the demo")
// 	// 启动演示
// 	container.Server()
// 	log.Info("Demo completed")
// }

// func runClientDemo() {
// 	// 创建客户端
// 	client := client.NewClient("rune_work.com:52051")
// 	// 初始化客户端
// 	if err := client.Init(); err != nil {
// 		log.Infof("Client init failed: %v", err)
// 		return
// 	}
// 	// 启动客户端
// 	if err := client.Start(); err != nil {
// 		log.Infof("Client start failed: %v", err)
// 		return
// 	}
// 	// 等待客户端完成测试
// 	time.Sleep(6 * time.Second)
// 	for i := 0; i < 5; i++ {
// 		if client.IsConnected() {
// 			message := map[string]interface{}{
// 				"text": fmt.Sprintf("Hello from client! Message #%d", i+1),
// 				"time": time.Now().Format(time.RFC3339),
// 			}
// 			client.SendMessage(uint32(i%2+1), message) // 使用不同路由ID
// 			time.Sleep(1 * time.Second)
// 		}
// 	}
// 	// 停止客户端
// 	if err := client.Stop(); err != nil {
// 		log.Infof("Client stop failed: %v", err)
// 	}
// }

// gameServer/demo/main.go
package main

import (
	"encoding/json"
	"gameServer/cluster/gate"
	"gameServer/cluster/node"
	"gameServer/log"
	"gameServer/registry/memory"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main1() {
	// 创建共享的注册中心实例
	registry := memory.NewMemoryRegistry()

	// 创建内存定位器
	locator := memory.NewMemoryLocator()

	// 设置注册中心的定位器
	registry.SetLocator(locator)

	// 创建网关组件
	gateComponent := gate.NewGate().
		SetTcpServer(":8080").
		SetRegistry(registry).
		SetLocator(locator)

	// 创建节点组件
	gameNode := node.NewNode("game", "localhost", 9090).
		SetRegistry(registry)

	// 注册节点处理函数
	gameNode.RegisterRPCHandler(1, func(data []byte) ([]byte, error) {
		var request map[string]interface{}
		if err := json.Unmarshal(data, &request); err != nil {
			return nil, err
		}

		response := map[string]interface{}{
			"original":  request,
			"processed": true,
			"timestamp": time.Now().UnixNano(),
			"node":      "game-node",
		}

		return json.Marshal(response)
	})

	// 启动所有组件
	log.Info("Starting distributed game server demo...")

	// 启动网关
	if err := gateComponent.Init(); err != nil {
		log.Fatalf("Failed to init gate: %v", err)
	}

	if err := gateComponent.Start(); err != nil {
		log.Fatalf("Failed to start gate: %v", err)
	}

	// 启动节点
	if err := gameNode.Init(); err != nil {
		log.Fatalf("Failed to init node: %v", err)
	}

	if err := gameNode.Start(); err != nil {
		log.Fatalf("Failed to start node: %v", err)
	}

	log.Info("All components started. Press Ctrl+C to stop.")

	// 等待中断信号
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	// 停止组件
	log.Info("Shutting down components...")

	if err := gameNode.Stop(); err != nil {
		log.Infof("Failed to stop node: %v", err)
	}

	if err := gateComponent.Stop(); err != nil {
		log.Infof("Failed to stop gate: %v", err)
	}

	log.Info("Demo completed")
}
